package kr.co.bettersoft.usedmarketandroid.activity;

import java.util.ArrayList;
import java.util.List;

import kr.co.bettersoft.usedmarketandroid.activity.UsedMarketCertificationActivity.RunnableCertificationStep1;
import kr.co.bettersoft.usedmarketandroid.activity.UsedMarketCertificationActivity.backgroundThreadCertificationStep1;
import kr.co.bettersoft.usedmarketandroid.adapter.UsedMarketFriendAdapter;
import kr.co.bettersoft.usedmarketandroid.common.CommonConstant;
import kr.co.bettersoft.usedmarketandroid.common.CommonUtil;
import kr.co.bettersoft.usedmarketandroid.common.UsedMarketRest;
import kr.co.bettersoft.usedmarketandroid.domain.UsedMarketMember;
import kr.co.bettersoft.usedmarketandroid.domain.UsedMarketSMS;
import kr.co.bettersoft.usedmarketandroid.fragment.FragmentMain;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ListActivity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.Toast;

/**
 * 친구에게 추천하기
 *   디바이스의 전화번호부를 읽어서 친구 목록을 뿌린다
 *   좌측 체크 박스 선택후 하단 친구에게 추천 버튼 터치하여 친구들에게 SMS 를 발송한다.
 *   
 *   상단 뒤로 버튼을 눌러 설정으로 돌아간다
 * @author blue
 *
 */
public class UsedMarketRecommandToFriendsActivity extends ListActivity implements OnScrollListener {
	
	public static String TAG = UsedMarketRecommandToFriendsActivity.class.getSimpleName();
	
	
	SharedPreferences sharedPrefCustom;
	// 사용자 휴대 전화번호.
	private String phoneNum = "";
	
	Button backBtn;
	Button sendBtn;
	
	// 필터링
	EditText editTextFriendName;

	private ProgressDialog dialog;
	
	
//	// 로그를 남긴다
//	private static final int THREAD_REGISTER_LOG = 100;
	
//	// 앱을 종료 한다.
//	private static final int ALERT_DIALOG_EXIT_ID = 101;
	
//	// 설치여부 목록을 가져 온다.
//	private static final int THREAD_SELECT_INSTALL_LIST = 103;
	
	// 전화번호부 친구 목록을 가져 온다.
	private static final int THREAD_FRIEND_LIST = 104;
	
	// 프로그레스 바를 출력 한다.
	private static final int THREAD_PROGRESS_BAR_VISIBLE = 105;
		
	// 프로그레스 바를 감춘다.
	private static final int THREAD_PROGRESS_BAR_INVISIBLE = 106;
	
	// 상대방을 선택하라는 dialog 창을 띄운다
	private static final int THREAD_RECEIVER_NOT_SELECTED = 117;
	
	// 친구들에게 앱 추천 SMS 전송
	private static final int SEND_RECOMMAND_SMS = 135;
	

	
	// 친구 어댑터 클래스.
	private UsedMarketFriendAdapter usedMarketFriendAdapter;

//	// sqlite 에 저장되어 있는 설치 사용자 목록
//	private ArrayList<SendMeInstall> sqliteInstallList = null;		
	
//	// 전화번호부에 저장되어 있는 전화번호 목록
//	private ArrayList<UsedMarketMember> phoneBookFriendList = null;
	
	// 화면 출력용 친구 목록. = phoneBookFriendList
	private ArrayList<UsedMarketMember> friendList = null;

	
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature( Window.FEATURE_NO_TITLE );
		setContentView(R.layout.usedmarket_recommand_to_friends_activity);
		
		// 설정파일을 가져 온다.
		this.confirmNotification();
		
		
		// 뒤로 가기 화살표 버튼을 설정 한다.
		backBtn = (Button)findViewById(R.id.backBtn);
		backBtn.setOnClickListener(new View.OnClickListener() {
					
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				// 화면을 닫는다.
				finish();
			}
		});
		
		sendBtn = (Button)findViewById(R.id.send_btn);
		sendBtn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				mHandler.sendMessage(mHandler.obtainMessage(SEND_RECOMMAND_SMS));
			}
		});
		
		// 화면 출력을 위한 친구 목록을 생성 한다.
		friendList = new ArrayList<UsedMarketMember>();
		
		CommonUtil commonUtil = new CommonUtil();
		friendList = commonUtil.selectPhoneBookAddressForShow(this);
		
		// 친구 어댑터를 생성 한다.
		usedMarketFriendAdapter = new UsedMarketFriendAdapter(getApplicationContext(), friendList);
		
		// list view 의 cursor 를 제공하기 위해서 어댑터를 세팅 한다.
		setListAdapter(usedMarketFriendAdapter);
		
		// 스크롤 이벤트 리스너를 등록 한다.
		getListView().setOnScrollListener(this);
		
		// list 레이아웃 그리기 캐쉬를 설정 한다.
		getListView().setAlwaysDrawnWithCacheEnabled (true);
		
		// 리스트 검색어 필터링
		editTextFriendName = (EditText) findViewById(R.id.editTextFriendName);
		editTextFriendName.addTextChangedListener(new TextWatcher() {
		    @Override
		    public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
		    	Log.d(TAG,"onTextChanged:"+cs);
		        // When user changed the Text
//		    	UsedMarketRecommandToFriendsActivity.this.adapter.getFilter().filter(cs);		UsedMarketFriendAdapter usedMarketFriendAdapter;
		    	usedMarketFriendAdapter.getFilter().filter(cs);
		    }
		    @Override
		    public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { }
		    @Override
		    public void afterTextChanged(Editable arg0) {}
		});
		
//		// 로깅.
//		mHandler.sendMessage(mHandler.obtainMessage(THREAD_REGISTER_LOG));
		
//		mHandler.sendMessage(mHandler.obtainMessage(THREAD_SELECT_INSTALL_LIST));
	}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	
	
	/**
	 * 필요한 핸들러를 등록해서 사용한다.
	 */
	private Handler mHandler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			
			Bundle b = msg.getData();
			try{
				if(b.getInt("showErrToast")==1){
					Toast.makeText(UsedMarketRecommandToFriendsActivity.this,b.getString("msg"), Toast.LENGTH_SHORT).show();
				}
				if(b.getInt("showAlert")==1){					 // 알림 및 경고창 . 
					new AlertDialog.Builder(returnThis())
					.setTitle(CommonConstant.alertTitle)							
					.setMessage(b.getString("msg"))
					.setIcon(R.drawable.ic_launcher)		// 경고창.  
					.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int whichButton) {
							// 그냥 사용자 확인 용이기 때문에 추가 조작 없음.
						}})
						.setNegativeButton("", null).show();
				}
				
				switch(msg.what) {
//				// 로그를 남긴다
//				case THREAD_REGISTER_LOG : 
//					threadRegisterLog();
//					break;
//				case ALERT_DIALOG_EXIT_ID : 
//					break;
//				// 차단 목록을 가져 온다.
//				case THREAD_SELECT_BLOCK_LISET : 
//					break;
//				// 설치 여부 목록을 가져 온다.
//				case THREAD_SELECT_INSTALL_LIST : 
//					// sqlite 에서 조회하여 리스트에 저장된 것을 조회, 디바이스의 전화번호부 조회. 둘을 합쳐서 화면 출력용 리스트 생성. 
//					threadProcessFriendListForShow();	
//					break;
				// 친구 목록을 세팅해서 출력 한다.
				case THREAD_FRIEND_LIST : 
					runOnUiThread(selectFriendList);
					break;
					// 프로그레스 바를 출력 한다.
				case THREAD_PROGRESS_BAR_VISIBLE : 
//						dialog.show();
					dialog = ProgressDialog.show(UsedMarketRecommandToFriendsActivity.this, "", "Wait..", true);
					break;
					// 프로그레스 바를 감춘다.
				case THREAD_PROGRESS_BAR_INVISIBLE : 
					dialog.dismiss();
					break;
				// 상대방을 선택하라는 dialog 를 띄운다
				case THREAD_RECEIVER_NOT_SELECTED : 
					showDialogReceiverNotSelected();
					break;
				case SEND_RECOMMAND_SMS : 
					runOnUiThread(new RunnableSendRecommendation());
					break;	
					
					
				}
				
			}catch(Exception e){
				e.printStackTrace();
			}

		}
	};
	
	
	
	
	
	
	
	/**
	 * 상대방 선택하라는 dialog 를 띄운다.
	 */
	private void showDialogReceiverNotSelected() {
		new AlertDialog.Builder(UsedMarketRecommandToFriendsActivity.this)
		.setTitle("상대방 선택")
		.setMessage("어플을 추천할 대상을 선택해 주시기 바랍니다.")
		.setNegativeButton("확인", new DialogInterface.OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which) {

			}
		}).show();
	}
	
	/**
	 * sqlite 에서 조회하여 리스트에 저장된 것을 조회, 디바이스의 전화번호부 조회. 둘을 합쳐서 화면 출력용 리스트 생성. 
	 */
	public void threadProcessFriendListForShow() {

		Thread thread = new Thread(new Runnable() {

			public void run() {
				
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));
				
				Log.d(TAG,"threadProcessFriendListForShow");
				
//				/*
//				 *  sqlite 에 저장된 설치 유저 목록. 전번, 이름, 닉네임, 설치여부까지 포함됨.
//				 */
//				SendMeDBManagerInstallUser sendMeDBManagerInstallUser = new SendMeDBManagerInstallUser(returnThis());
//				friendList = sendMeDBManagerInstallUser.selectInstallUserData();
				
				/*
				 * 전화번호부.
				 */
				
//				// 필터링을 위해서 닉네임이 있으면 이름 자리에 닉네임 세팅하도록 함. ###  --> 이름으로 사용
//				for(int i=0; i<friendList.size(); i++){			
//					if(friendList.get(i).getNickName().length()>0){
//						friendList.get(i).setName(friendList.get(i).getNickName());
//					}
//				}
				
				// 작업이 끝났다면 화면에 세팅하는 메소드를 호출
				Log.d(TAG,"produce list end. call show list method.");
				// ...  THREAD_FRIEND_LIST
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_FRIEND_LIST));
				
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
				
			}
		});
		thread.start();
	}
	
	/**
	 * 친구 목록을 세팅해서 출력 한다.
	 */
	private Runnable selectFriendList = new Runnable() {
		
		@Override
		public void run() {
			// TODO Auto-generated method stub
			
			// sqlite 목록과 전화번호부를 비교하여 적용할 최종 리스트를 생성한다. 		sqliteFriendList		phoneBookFriendList		friendList
			usedMarketFriendAdapter = new UsedMarketFriendAdapter(returnThis(), friendList);
			getListView().setAdapter(usedMarketFriendAdapter);
		}
	};
	
	
	
	
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 서버 통신
	
	/**
	 * 러너블. 친구들에게 추천 메시지를 전송한다.	   sendRecommendation	
	 */
	class RunnableSendRecommendation implements Runnable {
		public void run(){
			new backgroundThreadSendRecommendation().execute();
		}
	}
	/**
	 * backgroundThreadSendRecommendation
	 * 비동기    서버와 통신하여 친구들에게 추천 메시지를 전송한다.
	 * @author blue
	 *
	 */
	public class backgroundThreadSendRecommendation extends AsyncTask<Void, Void, Void>{
		@Override protected void onPostExecute(Void result) {  
			dialog.dismiss();
		} 
		@Override protected void onPreExecute() {  
			dialog = ProgressDialog.show(UsedMarketRecommandToFriendsActivity.this, "", "Wait..", true);
		} 
		@Override protected Void doInBackground(Void... params) {  
			Log.d(TAG,"backgroundThreadSendRecommendation");
			
			// 파라미터 세팅
//			CommonUtil commonUtil = new CommonUtil();
//			String nowTime = sendMeCommon.getCurrentDate();
			
			// 선택된 사람이 있는지 체크한다. 리스트에 담는다.
			ArrayList<String> stringReceiverArrayList = new ArrayList<String>();
			ArrayList<String> stringReceiverNameArrayList = new ArrayList<String>();
				for(int i=0; i<friendList.size(); i++){
					if((friendList.get(i)).getSelectedForRecommand()){
						stringReceiverArrayList.add((friendList.get(i)).getPhoneNumber());
						stringReceiverNameArrayList.add((friendList.get(i)).getPhoneBookName());
					}
				}
			//if you want your array
			String [] receiverList = stringReceiverArrayList.toArray(new String[stringReceiverArrayList.size()]);
			String [] receiverNameList = stringReceiverNameArrayList.toArray(new String[stringReceiverNameArrayList.size()]);
			
			
			CommonUtil commonUtil = new CommonUtil();
			String phoneNumToSend;
			
			if(receiverList.length<1) {				// 선택된 사람이 아무도 없다.
				Log.d(TAG,"no one selected");
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_RECEIVER_NOT_SELECTED));
			}else if(phoneNum.length()<1){
				showResultDialog("먼저 회원등록을 해주시기 바랍니다.");
			} else {				
				Log.d(TAG,"send recommand SMS to Friends");
				
				phoneNumToSend = commonUtil.phoneNumForShow(phoneNum);
				Log.d(TAG,"phoneNum:"+phoneNum);
				Log.d(TAG,"phoneNumToSend:"+phoneNumToSend);
				
				List<UsedMarketSMS> usedMarketSMSList = new ArrayList<UsedMarketSMS>();
				
				for(int i=0; i<receiverList.length; i++){
//					Log.d(TAG,i +"//:"+receiverList[i] + "//" +receiverNameList[i]);
					UsedMarketSMS usedMarketSMS = new UsedMarketSMS();
					usedMarketSMS.setSender(phoneNumToSend);
					usedMarketSMS.setPhoneNumber(receiverList[i]);
					usedMarketSMSList.add(usedMarketSMS);
				}
				UsedMarketRest usedMarketRest = new UsedMarketRest();
				
				String resultStr = usedMarketRest.RestSendRecommendation(usedMarketSMSList);
				if("F".equals(resultStr)){
					showResultDialog("요청이 실패하였습니다. 다시 시도해 주십시오.");
				}else{
					showResultDialog("추천 SMS를 발송하였습니다.");
				}
			}
			
			return null; 
		}
	}
	
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	
//	@Override
//	public void onActivityResult(int requestCode, int resultCode, Intent data) {
//		super.onActivityResult(requestCode, resultCode, data);
//		Bundle extraBundle;
//		if( requestCode == RECORDING_SCREEN_CALL ) {
//			
//			if(resultCode == Activity.RESULT_OK){		// 정상 반환시.
//				Log.d(TAG,"RESULT_OK");
//				extraBundle = data.getExtras();		// 번들을 반환했으니까 번들을 불러오면 세팅된 값을 가지고 있음.
//
////				String key1 = extraBundle.getString("key1");	
////				Log.d(TAG,"key1:"+key1);
//				
//			}else if(resultCode == Activity.RESULT_CANCELED){
//				Log.d(TAG,"RESULT_CANCELED");
//			}else if(resultCode == RESULT_MAIN_MENU_CALLED){
//				Log.d(TAG,"RESULT_MAIN_MENU_CALLED");
//				
//				// 화면을 닫는다.
//				sendMeActivityManager.removeActivity(UsedMarketRecommandToFriendsActivity.this);
//				finish();
//				
//			}
//		}
//	}
	
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	
	
	// 컨텍스트 반환
		public Context returnThis() {
			return this;
		}
	
	
	/**
	 * showResultDialog
	 * alert 창 띄움
	 *
	 * @param msg
	 * @param 
	 * @return 
	 */
	public void showResultDialog(final String msg){
		UsedMarketRecommandToFriendsActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = mHandler.obtainMessage();				
				Bundle b = new Bundle();
				b.putInt("showAlert", 1);
				b.putString("msg", msg);			// 화면에 보여줄 메시지
				message.setData(b);
				mHandler.sendMessage(message);
			}
		});
	}
		
		
	/**
	 * SharedPreference 정보를 확인 한다.
	 */
	public void confirmNotification() {
		sharedPrefCustom = getSharedPreferences(CommonConstant.prefName,
				Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE);
		phoneNum = sharedPrefCustom.getString("phoneNum", "");
	}
	
	
	@Override
	public void onResume(){
		super.onResume();
	}
	
	@Override
	public void onStop(){
		super.onStop();
//		dialog.dismiss();
	}
	
	@Override
	public void onScroll(AbsListView view, int firstVisibleItem,
			int visibleItemCount, int totalItemCount) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void onScrollStateChanged(AbsListView view, int scrollState) {
		// TODO Auto-generated method stub
		
	}

}
